﻿using System;
using System.Collections.Generic;
using System.Linq;
using Onshi.POS.Articulos.Vistas;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Repositorios;

namespace Onshi.POS.Articulos
{
    public class ArticulosBajaHabilitacionPresentador
    {
        #region Constructores

        public ArticulosBajaHabilitacionPresentador(IArticulosBajaHabilitacion vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IArticulosBajaHabilitacion vista;
        private List<Articulo> lista;

        #endregion

        #region Propiedades

        private RepositorioArticulo RepositorioArticulo
        {
            get { return new RepositorioArticulo(); }
        }

        private RepositorioTipoRegistro RepositorioTipoRegistro
        {
            get { return new RepositorioTipoRegistro(); }
        }

        public RepositorioRegistro RepositorioRegistro
        {
            get { return new RepositorioRegistro(); }
        }

        #endregion

        #region Metodos

        private void ActualizarLista()
        {
            lista = RepositorioArticulo.DevolverTodos();
        }

        private List<Articulo> FiltrarLista()
        {
            if (lista != null)
            {
                var consulta = (from Articulo item in lista
                                    where item.Codigo.ToLower().Contains(vista.CodigoFiltro.ToLower())
                                    & item.Nombre.ToLower().Contains(vista.NombreFiltro.ToLower())
                                    //& item.RubroArticulo.Id == vista.IdRubroArticuloFiltro
                                    //& item.TipoArticulo.Id == vista.IdTipoArticuloFiltro
                                    select item).ToList();
                return consulta.ToList();
            }
            else
                return lista;
        }

        public void Inicializar()
        {
            ActualizarLista();
            vista.Lista = lista;
        }

        public void Nuevo()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Modificar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Eliminar()
        {
            if (!DatosComunes.TienePermiso(EnumPermiso.ARTICULO_BAJA))
                throw new Exception(DatosComunes.SinPermiso);
            var articulo = RepositorioArticulo.DevolverPorId(vista.IdArticulo);
            if (articulo == null)
                throw new Exception("El articulo no existe");
            if (articulo.EstaEliminado)
                throw new Exception("El articulo no se encuentra habilitado");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.ARTICULO_BAJA);
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            RepositorioArticulo.Eliminar(articulo);
            RepositorioRegistro.Insertar(registro, articulo);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Habilitar()
        {
            if (!DatosComunes.TienePermiso(EnumPermiso.ARTICULO_HABILITACION))
                throw new Exception(DatosComunes.SinPermiso);
            var articulo = RepositorioArticulo.DevolverPorId(vista.IdArticulo);
            if (articulo == null)
                throw new Exception("El articulo no existe");
            if (!articulo.EstaEliminado)
                throw new Exception("El articulo no se encuentra eliminado");
            var registro = new Registro();
            registro.Usuario = DatosComunes.Usuario;
            registro.Tipo = RepositorioTipoRegistro.DevolverPorId((Byte)EnumTipoRegistro.ARTICULO_HABILITACION);
            if (registro.Tipo == null)
                throw new Exception("El tipo de registro no existe");
            RepositorioArticulo.Habilitar(articulo);
            RepositorioRegistro.Insertar(registro, articulo);
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Actualizar()
        {
            ActualizarLista();
            vista.Lista = FiltrarLista();
        }

        public void Filtrar()
        {
            vista.Lista = FiltrarLista();
        }

        public void VerImagen()
        {
            var articulo = RepositorioArticulo.DevolverPorIdConDetalle(vista.IdArticulo);
            vista.Detalle = articulo.Detalle;
        }

        public void VerObservacion()
        {
            var articulo = RepositorioArticulo.DevolverPorIdConDetalle(vista.IdArticulo);
            vista.Detalle = articulo.Detalle;
        }
        #endregion
    }
}
